- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Графические интерфейсы пользователя Java - Тимур Сергеевич Машнин
Шрифт:
Интервал:
Закладка:
В этом примере мы создаем объект Action, определяющий имя кнопки панели инструментов, горячие клавиши и всплывающую подсказку.
Border
Каждый JComponent это прямоугольная область на экране с границами.
Границы или стороны прямоугольника могут быть выделены каким-то образом на экране.
Библиотека Swing позволяет изменить оформление границ любого компонента, обведя его рамкой разного вида.
Хотя технически вы можете установить рамку для любого объекта, который наследуется от класса JComponent, внешний вид некоторых стандартных компонентов Swing не очень хорошо работает с пользовательскими рамками.
В общем случае, когда вы хотите установить свою рамку для стандартного компонента Swing, рекомендуется поместить компонент в панель JPanel и установить рамку для этой панели.
Чтобы разместить рамку вокруг компонента JComponent, используется метод setBorder, который в качестве аргумента принимает объект Border.
Интерфейс Border описывает общие свойства всех рамок.
Его метод paintBorder отвечает за рисование рамки для указанного компонента с указанным положением и размером.
Рамка может быть прозрачной или не прозрачной. Это определяется логическим методом isBorderOpaque.
Последний метод интерфейса, getBorderInsets, возвращает пространство, занятое рамкой данного компонента, в виде экземпляра класса Insets.
В классе Insets это пространство определяется толщиной рамки сверху, слева, справа и снизу.
Интерфейс Border частично реализован абстрактным классом AbstractBorder, в котором определена пустая реализация метода paintBorder, метод isBorderOpaque возвращает false, а метод getBorderInsets – возвращает объект с нулевыми значениями.
Кроме этих реализаций в классе AbstractBorder есть метод getInteriorRectangle, который удобно использовать для определения размеров самого компонента без рамки.
Класс AbstractBorder расширяют около двадцати классов, рисующие разные рамки.
Для удобства работы с ними имеется класс BorderFactory, в котором собраны статические методы вида createXxxBorder () для различных типов рамок с разными параметрами.
Поэтому для создания рамки достаточно использовать один из этих методов, а затем установить полученную рамку в компонент методом setBorder.
Класс EmptyBorder представляет самую простую рамку.
Это пустое пространство, окружающее компонент.
Класс LineBorder определяет одноцветную рамку заданной толщины, одинаковой на всех сторонах рамки.
Первый аргумент задает цвет рамки, второй аргумент задает толщину рамки и третий аргумент создает рамку с закругленными краями.
Рамка BevelBorder состоит из двух линий: светлой и темной.
Если светлая линия расположена сверху и слева, а темная справа и снизу, то создается впечатление падения света сверху слева и компонент выглядит выпуклым.
Это тип RAISED, он указывается как первый аргумент.
Если же поменять местами темные и светлые линии, тогда компонент выглядит вдавленным в поверхность контейнера.
Это тип LOWERED.
Класс SoftBevelBorder расширяет класс BevelBorder, создавая рамки со слегка закругленными, смягченными краями.
Класс EtchedBorder создает объемную рамку врезанную или вдавленную в контейнер в зависимости от типа.
Рамка MatteBorder может состоять из повторяющегося изображения, или из линий разной толщины, но одного и того же цвета.
Аргументами метода служат размеры рамки в пикселях и изображение или цвет.
Класс TitledBorder позволяет создать рамку с надписью.
В простейшем случае создается простая рамка толщиной в один пиксель, в которую слева сверху вставлена строка.
Однако надпись можно вставить в рамку любого типа.
Первым аргументом служит рамка, в которую нужно вставить надпись, второй аргумент – это надпись, третий аргумент – это выравнивание надписи по горизонтали, четвертый аргумент – это расположение надписи на рамке, пятый аргумент – это шрифт, и шестой аргумент – это цвет надписи.
Класс CompoundBorder создает рамку, состоящую из двух вложенных рамок любых типов.
Первым аргументов указывается внешняя рамка, а вторым аргументом указывается внутренняя рамка.
Рамка DashedBorder представляет собой пунктирную линию.
Первым аргументом указывается цвет рамки, второй аргумент – это длина пунктира, третий аргумент – это расстояние между пунктирами.
Свою рамку можно создать, расширив какой-либо класс рамок или расширив абстрактный класс AbstractBorder.
Look and Feel
Как уже было сказано, вид и контроллер, в архитектуре MVC библиотеки Swing, объединены вместе в один элемент – представителя пользовательского интерфейса (delegate UI).
Класс графического Swing компонента связывает модель и представителя с помощью менеджера пользовательского интерфейса (UIManager), который определяет внешний вид и поведение интерфейса (Look and Feel).
Именно поэтому библиотека Swing имеет подключаемую архитектуру look-and-feel.
Вид (look) каждого графического компонента задают его форма, тип и цвет рамки, цвет фона, цвет, тип и размер шрифта, форма курсора мыши.
Поведение компонента (feel) определяют та или иная реакция на действия мыши, набор командных клавиш, способ перемещения окон и т. д.
Таким образом, для реализации модели MVC библиотека Swing использует делегирование (delegation) полномочий, назначая в качестве модели данных представителя (delegate) – экземпляр класса с именем вида xxxModel.
Класс библиотеки Swing содержит защищенное или даже закрытое поле model – объект этого класса-модели, и метод getModel, предоставляющий разработчику доступ к полю model.
Для обеспечения внешнего вида и поведения Swing компонента также используется делегирование полномочий.
Swing класс JComponent содержит защищенное поле ui – экземпляр класса-представителя ComponentUI из пакета javax.swing.plaf, непосредственно отвечающего за вывод изображения на экран в нужном виде.
Класс-представитель содержит методы paint и update, формирующие и обновляющие графику компонента.
Такие представители образуют целую иерархию с общим суперклассом ComponentUI.
Они собраны в пакет javax.swing.plaf и его подпакеты.
В их именах есть буквы UI (User Interface), например, ButtonUI.
Представители класса тоже являются полями класса Swing компонента, и доступ к ним осуществляется методами вида getUI.
Таким образом, каждый компонент имеет UI-делегата, который отвечает за внешний вид и поведение интерфейса (Look and Feel).
Класс UIManager имеет статический метод с именем getUI.
Когда создается какой-либо Swing компонент, он вызывает этот метод для получения UI-делегата.
UIManager знает, какой установлен текущий внешний вид, и таким образом, создается нужный экземпляр UI-делегата.
UIManager содержит текущий внешний вид и поведение в виде объекта LookAndFeel, который определяет сопоставления между идентификаторами классов и UI-делегатами в хэш-таблице UIDefaults.
Эта идея аналогична идее, используемой в библиотеке AWT для создания экземпляров пиров, зависимых от платформы.
LookAndFeel – это абстрактный базовый класс для всех классов внешнего вида и поведения.
Каждая реализация LookAndFeel должна обеспечивать реализацию соответствующего подкласса ComponentUI или UI-делегата, указав значение для каждого из идентификаторов классов Swing компонентов в объекте UIDefaults, который возвращается методом getDefaults LookAndFeel.
Теперь, как установить внешний вид и поведение?
Во-первых, если вы собираетесь установить L & F программным способом, вы должны сделать это как самый первый шаг в своем приложении.
В противном случае вы рискуете инициализировать L & F по умолчанию независимо от того, какой L & F вы затем запросили.
Это может произойти непреднамеренно, когда статическое поле ссылается на класс Swing, что приводит к загрузке L & F по умолчанию.
Как уже было сказано, связующим звеном между компонентом и внешним видом является менеджер UIManager.
При этом класс UIManager хранит доступные L&F в виде массива объектов вложенного класса UIManager. LookAndFeelInfo.
Посмотреть все доступные L&F можно с помощью метода getInstalledLookAndFeels класса UIManager.
Задать один из доступных L&F можно с помощью статического метода

